package com.shujia.wyh.day02;

/*
    位运算符：对数据的二进制形式做运算
    | & ^ << >> >>> ~
 */
public class WeiDemo1 {
    public static void main(String[] args) {
//        int a = 3;
//        int b = 4;

//        System.out.println(a|b); //7
//        System.out.println(a&b); //0
//        System.out.println(a^b); //7
//        System.out.println(~b);  //-5
//
//
//        //左移：将补码整体向左移动若干位，右边用0补齐，左边多出来的丢弃,左移实际上就是乘上2的位数次幂
//        System.out.println(2<<3); //16  2*8=>2*2^3
//        System.out.println(2<<4); //2*2^4=32

        //右移：将补码整体向右移动若干位，右边多出来的丢掉，左边如果最高位是1，就用1补齐，如果最高位是0就用0补齐
        System.out.println(24>>2); //6
        System.out.println(-24>>2); //-6

        //>>>无符号右移： 将补码整体向右移动若干位，右边多出来的丢掉，左边无论最高位是1还是0都用0补齐
        System.out.println(-24>>>2);

        //请用最有效率的方式写出计算2乘以8的结果
        System.out.println(2<<3);

    }
}

/*
    3的二进制：00000000 00000000 00000000 00000011
    4的二进制：00000000 00000000 00000000 00000100
    由于3和4都是正数，所以
    3的补码：00000000 00000000 00000000 00000011
    4的补码：00000000 00000000 00000000 00000100

        00000000 00000000 00000000 00000011
       | 有1则1
        00000000 00000000 00000000 00000100
        ------------------------------------
        00000000 00000000 00000000 00000111

        00000000 00000000 00000000 00000011
       & 有0则0
        00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000000

        00000000 00000000 00000000 00000011
       ^  相同则0，不同则1
        00000000 00000000 00000000 00000100
        ------------------------------------
        00000000 00000000 00000000 00000111

        00000000 00000000 00000000 00000100
       ~ 1变成0，0变成1
       -------------------------------------
 补码：  11111111 11111111 11111111 11111011
 反码：  11111111 11111111 11111111 11111010
 原码：  10000000 00000000 00000000 00000101
 --------------------------------------------------
       -5

       2<<3
       2的补码：00000000 00000000 00000000 00000010

       00000000 00000000 00000000 00000010
       -----------------------------------
       00000000 00000000 00000000 00010000


      24的补码：00000000 00000000 00000000 00011000

      00000000 00000000 00000000 00011000
      -----------------------------------
      00000000 00000000 00000000 00000110

      -24的原码：10000000 00000000 00000000 00011000
      -24的反码：11111111 11111111 11111111 11100111
      -24的补码：11111111 11111111 11111111 11101000

      11111111 11111111 11111111 11101000
      ------------------------------------
      11111111 11111111 11111111 11111010
      已知补码求原码：
      1 1111111 11111111 11111111 11111010
      1 1111111 11111111 11111111 11111001
      1 0000000 00000000 00000000 00000110
      ------------------------------------
      -6


 */
